// @ts-ignore
import Node from './Node.ts'
import LinkList from './LinkList'

/**
 * 链表接口定义
 *
 * @template T 元素类型
 */

export interface ILinkList<T> {
  /**
   * 在链表末尾添加元素
   *
   * @param element 要添加的元素
   * @returns 返回当前链表实例
   */
  append(element: T): LinkList<T>

  /**
   * 在指定位置插入元素
   *
   * @param position 插入位置的索引
   * @param element 要插入的元素
   * @returns 返回当前链表实例
   */
  insert(position: number, element: T): LinkList<T>

  /**
   * 移除指定位置的元素
   *
   * @param position 要移除元素的位置索引
   * @returns 返回被移除的元素
   */
  removeAt(position: number): T

  /**
   * 移除指定元素
   *
   * @param element 要移除的元素
   * @returns 返回被移除的元素
   */
  remove(element: T): T

  /**
   * 清空链表
   */
  clear(): void

  /**
   * 更新指定位置的元素
   *
   * @param position 要更新元素的位置索引
   * @param element 新的元素值
   * @returns 返回当前链表实例
   */
  update(position: number, element: T): LinkList<T>

  /**
   * 获取指定位置的元素
   *
   * @param position 要获取元素的位置索引
   * @returns 返回指定位置的元素，如果位置无效则返回null
   */
  get(position: number): T | null

  /**
   * 查找元素在链表中的索引位置
   *
   * @param element 要查找的元素
   * @returns 返回元素在链表中的索引，如果不存在则返回-1
   */
  indexOf(element: T): number | -1

  /**
   * 判断链表是否为空
   *
   * @returns 如果链表为空则返回true，否则返回false
   */
  isEmpty(): boolean

  /**
   * 获取链表的大小
   *
   * @returns 返回链表中元素的个数
   */
  get size(): number

  /**
   * 获取链表的头节点
   *
   * @returns 返回链表的头节点，如果链表为空则返回null
   */
  get head(): Node<T> | null

  /**
   * 获取链表的尾节点
   *
   * @returns 返回链表的尾节点，如果链表为空则返回null
   */
  get tail(): Node<T> | null

  /**
   * 将链表转换为字符串表示
   *
   * @returns 返回链表的字符串表示
   */
  toString(): string
}
